package com.li.onjava8.concurrent.cf;

import com.li.onjava8.concurrent.utils.Machina;

import java.util.concurrent.CompletableFuture;

/**
 * 当我们将handle()包装在CompletableFuture中时，我们发现我们可以在CompletableFuture上添加操作来处理所包含的对象
 * @author li
 * @date 2023/10/30 15:34
 */
public class CompletableApply {
    public static void main(String[] args) {
        //创建一个已完成的任务
        CompletableFuture<Machina> cf1 = CompletableFuture.completedFuture(new Machina(0));
        //thenApply: 返回一个新的CompletionStage，当此阶段正常完成时，将使用此阶段的结果作为所提供函数的参数执行该阶段。
        //当子线程完成后，需要调用一些回调方法，如果是Java8以前，我们写的会稍微复杂。Java8的CompletableFuture已经为我们实现了几个回调函数，使用非常方便。
        //apply 有“申请”、“应用”的意思，我个人理解为把上一个线程的结果“应用于”下一个线程的计算。相当于结果值的传递。
        CompletableFuture<Machina> cf2 = cf1.thenApply(Machina::work);
        CompletableFuture<Machina> cf3 = cf2.thenApply(Machina::work);
        CompletableFuture<Machina> cf4 = cf3.thenApply(Machina::work);
        CompletableFuture<Machina> cf5 = cf4.thenApply(Machina::work);
    }
}